package cn.yuemouren.queue.leetcode;

import cn.yuemouren.queue.PriorityQueue;

import java.util.Map;
import java.util.TreeMap;

/**
 * @Author: Timi
 * @Description:
 *      给定一个非空的整数数组，返回其中出现频率前 k 高的元素。
 * 示例 1:
 *
 *  输入: nums = [1,1,1,2,2,3], k = 2
 *  输出: [1,2]
 * 示例 2:
 *
 *  输入: nums = [1], k = 1
 *  输出: [1]
 *
 * 提示：
 *  你可以假设给定的 k 总是合理的，且 1 ≤ k ≤ 数组中不相同的元素的个数。
 *  你的算法的时间复杂度必须优于 O(n log n) , n 是数组的大小。
 *  题目数据保证答案唯一，换句话说，数组中前 k 个高频元素的集合是唯一的。
 *  你可以按任意顺序返回答案。
 * @Date: 2020/7/2 9:03
 */
public class ValidParenthesis_347 {

    private class Frequency implements Comparable<Frequency>{

        private int t,freq;

        public Frequency(int t, int freq) {
            this.t = t;
            this.freq = freq;
        }

        @Override
        public int compareTo(Frequency other) {
            if(freq > other.freq ){
                return -1;
            } else if(freq < other.freq){
                return 1;
            }
            return 0;
        }
    }

    public int[] topKFrequent(int[] nums, int k) {
        //统计数字出现频次
        Map<Integer,Integer> map = new TreeMap<>();
        for (int num : nums){
            if(map.containsKey(num)){
                map.put(num,map.get(num) + 1);
            } else {
                map.put(num,1);
            }
        }
        PriorityQueue<Frequency> priorityQueue = new PriorityQueue<>();
        map.forEach( (key,value) -> {
            if(priorityQueue.getSize() < k){
                priorityQueue.enQueue(new Frequency(key,value));
            } else if(key > priorityQueue.getHead().freq){
                priorityQueue.dnQueue();
                priorityQueue.enQueue(new Frequency(key,value));
            }
        });
        int[] res = new int[priorityQueue.getSize()];
        for (int i = 0; i < res.length; i++){
            res[i] = priorityQueue.dnQueue().t;
        }
        return res;
    }
}
